import { defineStore } from 'pinia'
import { ref } from 'vue'
import { getUserInfo, updateUserInfo, uploadAvatar } from '@/api/user'
import { ElMessage } from 'element-plus'

export const useUserStore = defineStore('user', () => {
  const userInfo = ref({
    account: '',    // 米米号
    name: '',       // 昵称
    email: '',      // 邮箱
    photo: '',      // 头像
    signature: '',  // 个性签名
    hasSecondaryPassword: 0, // 是否设置过二级密码 (0: 否, 1: 是)
    isSecondaryPasswordActive: 0, // 修改：二级密码当前是否启用 (0: 否, 1: 是)
    // 游戏相关信息
    gameInfo: {
      nick: '',             // 游戏昵称
      maxArenaWins: 0,      // 最大竞技场胜利次数
      curStage: 0,          // 当前阶段
      petMaxLev: 0,         // 宠物最高等级
      monKingWin: 0,        // 怪物王胜利次数
      taskIds: '',          // 任务ID列表 - 逗号分隔的字符串
      petAllNum: 0,         // 所有宠物数量
      messWin: 0            // 混战胜利次数
    },
  })

  // 将taskIds字符串转为数组的工具函数
  const getTaskIdsArray = () => {
    const taskIds = userInfo.value?.gameInfo?.taskIds || ''
    if (!taskIds || taskIds === '') return []
    
    return taskIds.split(',').map(id => id.trim())
  }

  // 设置用户信息
  const setUserInfo = (info) => {
    if (!info) {
      console.warn('用户信息为空')
      return
    }
    

    // 映射后端返回的字段到前端使用的字段
    const mappedInfo = {
      account: info.account || '',       // 米米号
      name: info.name || '',             // 用户名
      email: info.email || '',           // 邮箱
      hasSecondaryPassword: info.hasSecondaryPassword, // 确保是 0 或 1
      isSecondaryPasswordActive: info.isSecondaryPasswordActive, // 修改：转换为 0 或 1
      // 保留其他可能在UI中使用的字段
      photo: userInfo.value.photo,       // 保留现有头像
      signature: userInfo.value.signature || '',  // 保留个性签名
      
      // 添加游戏信息
      gameInfo: {
        nick: info.gameInfo?.nick || '',
        maxArenaWins: info.gameInfo?.maxArenaWins || 0,
        curStage: info.gameInfo?.curStage || 0,
        petMaxLev: info.gameInfo?.petMaxLev || 0,
        monKingWin: info.gameInfo?.monKingWin || 0,
        taskIds: info.gameInfo?.taskIds || '',  // 保持原字符串格式
        petAllNum: info.gameInfo?.petAllNum || 0,
        messWin: info.gameInfo?.messWin || 0
      },
    }

    Object.assign(userInfo.value, mappedInfo)
  }

  // 更新头像
  const updateAvatar = async (file) => {
    const formData = new FormData()
    formData.append('file', file)
    
    try {
      const res = await uploadAvatar(formData)
      if (res?.code === 200 && res?.data?.photo) {
        userInfo.value.photo = res.data.photo
        return res.data.photo
      }
      return null
    } catch (error) {
      console.error('上传头像失败:', error)
      return null
    }
  }

  // 获取用户信息
  const fetchUserInfo = async () => {
    try {
      const res = await getUserInfo()

      if (res.code === 200) {
        setUserInfo(res.data)
        return res.data
      }
    } catch (error) {
      console.error('获取用户信息失败:', error)
      ElMessage.error('获取用户信息失败')
    }
  }

  // 更新用户信息
  const updateInfo = async (data) => {
    try {
      const res = await updateUserInfo(data)
      if (res?.code === 200) {
        // 更新成功后，重新获取用户信息以确保数据同步
        const newUserInfo = await fetchUserInfo()
        if (newUserInfo) {
          ElMessage.success('更新成功')
          return true
        }
      }
      ElMessage.error(res?.msg || '更新失败')
      return false
    } catch (error) {
      console.error('更新用户信息失败:', error)
      ElMessage.error('更新失败')
      return false
    }
  }

  // 检查用户是否有特定任务
  const hasTask = (taskId) => {
    if (!userInfo.value?.gameInfo?.taskIds) return false
    
    const taskIds = userInfo.value.gameInfo.taskIds

    
    if (!taskIds || taskIds === '') return false
    
    // 将逗号分隔的字符串转为数组
    const taskIdsArray = taskIds.split(',')

    // 转换待检查的taskId为字符串
    const taskIdStr = taskId.toString()
    
    // 检查任务ID是否存在
    return taskIdsArray.includes(taskIdStr)
  }

  // 处理阶段图片通关状态
  const updateStageImages = (stageImages) => {
    if (!stageImages || !Array.isArray(stageImages)) return stageImages
    
    // 克隆数组以避免直接修改原数组
    const updatedStageImages = JSON.parse(JSON.stringify(stageImages))

    // 遍历每个阶段图片
    updatedStageImages.forEach(stage => {
      // 如果该阶段ID存在于taskIds中，标记为已通过
      if (hasTask(stage.id)) {
        stage.pass = true
      }
    })
    return updatedStageImages
  }

  // 更新从字符串到数组的taskIds
  const updateTaskIds = (taskIdsString) => {
    if (typeof taskIdsString === 'string') {
      userInfo.value.gameInfo.taskIds = taskIdsString
      return getTaskIdsArray()
    }
    return []
  }

  // 添加清空用户信息的方法
  const clearUserInfo = () => {
    userInfo.value = {
      account: '',
      name: '',
      email: '',
      photo: '',
      signature: '',
      hasSecondaryPassword: 0,
      isSecondaryPasswordActive: 0, // 修改：清空时重置为 0
      gameInfo: {
        nick: '',
        maxArenaWins: 0,
        curStage: 0,
        petMaxLev: 0,
        monKingWin: 0,
        taskIds: '',
        petAllNum: 0,
        messWin: 0
      }
    }
  }

  return {
    userInfo,
    setUserInfo,
    updateAvatar,
    fetchUserInfo,
    updateInfo,
    hasTask,
    updateStageImages,
    getTaskIdsArray,
    updateTaskIds,
    clearUserInfo
  }
}) 